package main

import "fmt"

func defer1(x int) {

	fmt.Println("defer1:", x)
}

func defer2(x int) {
	fmt.Println("defer2:", x)
}

func defer3(x int) {
	fmt.Println("defer3:", x)
}

func test42_1() {
	var i = 1
	defer func() { fmt.Println("i =", i) }() // i=2， 执行匿名函数，该函数会访问外部变量，所以，外部变量变化后，打印结果也会改变。
	i++

	var x = 1

	defer defer1(x)         // 暂时不执行，先压入到栈中,此时x已经传给了defer1函数(值拷贝),后续x的改变不会对defer1函数中的x参数有影响
	fmt.Println("main1", x) //1

	x++
	defer defer2(x)         // 暂时不执行，先压入到栈中
	fmt.Println("main2", x) // 2

	x++
	defer defer3(x)         // 暂时不执行，先压入到栈中
	fmt.Println("main3", x) // 3

	// 函数执行完后，再执行栈中的defer(后进先出)
}

func main42() {
	fmt.Println("ok")
	// panic异常了也会执行
	defer func() {
		fmt.Println("this is defer")
	}()
	panic("异常了")
}
